package org.example.threadlocaltest.demos.configure;

import org.example.threadlocaltest.demos.enums.UnifiedReturnEnum;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

/**
 * 全局异常处理
 * 另外，我看到很多人说 ，security 过滤器中的异常这里是捕获不到的，但是我想了一下
 * 登录走的是我们自己的登录接口，走的是 controller ，只不过借用了security 中的一部分代码，那么这里是可以捕获到异常的
 * 权限校验走的是 security 的过滤器 @PreAuth那一套，但是我这里实验过后也是可以捕获到异常的
 * 不然我也不会多此一举写一个方法 专门来捕获 AccessDeniedException 异常
 */
@RestControllerAdvice
public class GlobalExceptionHandler {

    //这里一定要写上异常的全类名，因为还有一个 AccessDeniedException 是 java.nio.file.AccessDeniedException
    @ExceptionHandler(org.springframework.security.access.AccessDeniedException.class)
    public UnifiedReturn<String> accessDeniedExceptionHandler(org.springframework.security.access.AccessDeniedException e) {
        return UnifiedReturn.error(UnifiedReturnEnum.NO_PERMISSION.getCode(), e.getMessage());
    }

    //org.springframework.security.authentication.BadCredentialsException: 用户名或密码错误
    @ExceptionHandler(org.springframework.security.authentication.BadCredentialsException.class)
    public UnifiedReturn<String> badCredentialsExceptionHandler(org.springframework.security.authentication.BadCredentialsException e) {
        return UnifiedReturn.error(UnifiedReturnEnum.BAD_CREDENTIALS.getCode(), e.getMessage());
    }


    @ExceptionHandler(Exception.class)
    public UnifiedReturn<String> exceptionHandler(Exception e) {
        return UnifiedReturn.error(UnifiedReturnEnum.FAIL.getCode(), e.getMessage());
    }


}
